package com.w3c.pragmatic.config;

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 阿里云配置
 *
 * @author wangdong
 * @since 2025/2/24 11:10
 */
@Slf4j
@Data
@Configuration
public class AliOssConfig {

  @Value("${ali.oss.endpoint}")
  @ApiModelProperty(value = "阿里云地域节点,即云服务域名")
  private String endpoint;

  @Value("${ali.oss.accessKeyId}")
  @ApiModelProperty(value = "秘钥id")
  private String accessKeyId;

  @Value("${ali.oss.accessKeySecret}")
  @ApiModelProperty(value = "秘钥")
  private String accessKeySecret;

  @Value("${ali.oss.bucketName}")
  @ApiModelProperty(value = "bucket桶,即存储空间的名称")
  private String bucketName;

  @Value("${ali.oss.directory}")
  @ApiModelProperty(value = "默认上传路径")
  private String directory;

  @Value("${ali.oss.urlPrefix}")
  @ApiModelProperty(value = "这里是访问域名（一般区别于endpoint）")
  private String urlPrefix;

  @Bean
  public OSS ossClient() {
    ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
    // 设置OSSClient允许打开的最大HTTP连接数，默认为1024个。
    conf.setMaxConnections(500);
    // 设置Socket层传输数据的超时时间，默认为50000毫秒。
    conf.setSocketTimeout(10000);
    // 设置建立连接的超时时间，默认为50000毫秒。
    conf.setConnectionTimeout(10000);
    // 设置从连接池中获取连接的超时时间（单位：毫秒），默认不超时。
    conf.setConnectionRequestTimeout(10000);
    // 设置连接空闲超时时间。超时则关闭连接，默认为60000毫秒。
    conf.setIdleConnectionTime(10000);
    // 设置失败请求重试次数，默认为3次。
    conf.setMaxErrorRetry(5);
    // 设置是否开启二级域名的访问方式，默认不开启
    conf.setSLDEnabled(false);
    // 初始化
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, conf);
    log.info("Ali ossClient init success.");
    return ossClient;
  }
}
